package ru.chaykin.viewobject.texture;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

import ru.chaykin.primitives.Circle;
import ru.chaykin.viewobject.ViewObject;


public class Texture extends ViewObject {
	
	public static final int TEX_PIXEL_WIDTH = 256;
	public static final int TEX_PIXEL_HEIGHT = 256;
	
	private static final int NUM_OF_INDICES = 6;
	private static final float Z = 0;
	
	private static final int SEL_COLOR = 0xb3; //30% прозрачность
	private static final int DESEL_COLOR = 0x1; //30% прозрачность
	
	private float currColor = DESEL_COLOR;
	
	private int textureId;
	/**
	 * Поверхность, на которую натягивается текстура
	 */
	private FloatBuffer texVertex; 

	/**
	 * Для создания экземпляра воспользуйтесь TextureFactory
	 */
	Texture(Circle boundCircle, int id, int midIndex, float[] rect) {
		this.boundCircle = boundCircle;
		textureId = id;
		this.midIndex = midIndex;
		ByteBuffer vbb = ByteBuffer.allocateDirect(12 * Float.SIZE / 8); //12 это 4 точки по 3 координаты
		vbb.order(ByteOrder.nativeOrder());
		texVertex = vbb.asFloatBuffer();
		texVertex.put(rect[0]); 
		texVertex.put(rect[1]);	//0
		texVertex.put(Z);
		
		texVertex.put(rect[2]); 
		texVertex.put(rect[3]);	//1
		texVertex.put(Z);
		
		texVertex.put(rect[4]); 
		texVertex.put(rect[5]);	//2
		texVertex.put(Z);
		
		texVertex.put(rect[6]); 
		texVertex.put(rect[7]);	//3
		texVertex.put(Z);
	
		texVertex.position(0);
	}

	public void draw(GL10 gl) {
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		gl.glVertexPointer(3, GL10.GL_FLOAT, 0, texVertex);
		gl.glColor4f(1, 1, 1, DESEL_COLOR);	//Непонятно, но без этого не работает :(
		gl.glEnable(GL10.GL_TEXTURE_2D);
		gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
		gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TextureFactory.getTexCoord());
		gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
		gl.glDrawElements(GL10.GL_TRIANGLES, NUM_OF_INDICES, GL10.GL_UNSIGNED_SHORT, TextureFactory.getIndices());
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
		gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
		gl.glDisable(GL10.GL_TEXTURE_2D);
	}

	@Override
	public void setSelected(boolean sel) {
		currColor = sel ? SEL_COLOR : DESEL_COLOR;
	}

	@Override
	public boolean isRegion() {
		return false;
	}
}
